package collection;

import space.position.Point;

import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

/**
 * Set  集合接口
 * 继承Collection接口
 *
 * 不能不包含重复元素，更确切地讲，set 不包含满足 e1.equals(e2) 的元素对 e1 和 e2，并且最多包含一个 null 元素
 * Set集合的功能（方法）和Collection是一致的。
 * Set: 元素是无序的（存入和取出的顺序不一定一致），元素不可以重复
 *
 *      HashSet：底层数据结构是哈希表，不同步
 *      TreeSet：底层数据结构是二叉树，不同步
 *
 *
 *
 * HashSet  集合类
 * 继承AbstractSet抽象类，实现Set接口
 * HashSet对象中不能存储相同的数据，存储数据时是无序的
 * 但是HashSet存储元素的顺序并不是按照存入时的顺序（和List显然不同），是按照哈希值来存的所以取数据也是按照哈希值取得
 *
 * 构造方法
 *
 * 构造一个新的空 set，其底层 HashMap 实例的默认初始容量是 16，加载因子是 0.75。
 * public HashSet(){}
 *
 * 构造一个包含指定 collection 中的元素的新 set。
 * 使用默认的加载因子 0.75 和足以包含指定 collection 中所有元素的初始容量来创建 HashMap。
 * public HashSet(Collection<? extends E> c){}
 *
 * 构造一个新的空 set，其底层 HashMap 实例具有指定的初始容量和默认的加载因子（0.75）
 * public HashSet(int initialCapacity){}
 *
 * 构造一个新的空 set，其底层 HashMap 实例具有指定的初始容量和指定的加载因子。
 * public HashSet(int initialCapacity,float loadFactor){}
 *
 *
 *
 *
 * TreeSet类
 * 存储特点：有序，不重复；key不能为空，value可以为null
 * （总结一点：凡是有Tree的集合，都是有序的，凡是有Set的就是不重复的）
 *
 * 底层原理：使用NavigableMap，但NavigableMap只是一个接口，最终是使用TreeMap
 *
 * 构造函数
 *
 * public TreeSet()                         底层创建新的TreeMap
 *
 * public TreeSet(Collection c)             通过集合构造TreeSet
 *
 * public TreeSet(Comparator comparator)    自定义比较器的TreeSet
 *              如果TreeSet存储的是对象，可以通过对象实现Comparator，实现自定义对象比较器
 *
 * public TreeSet(SortedSet s)              通过set构造TreeSet
 *
 * 常用方法
 *
 * public boolean add(E e)                  添加元素
 *
 * public  boolean addAll(Collection c)     通过集合添加元素
 *
 * public E ceiling(E e)                    返回大于或等于给定键值的最小键值
 *
 * public void clear()                      清空集合
 *
 * public Object clone()                    克隆集合
 *
 * public Comparator comparator()           用于在此树映射中维护顺序的比较器，如果使用其键的自然顺序，则为null
 *
 * public boolean contains(Object o)        是否包含摸个元素
 *
 * public Iterator descendingIterator()     用于按降序迭代元素。
 *
 * public NavigableSet descendingSet()      ？
 *
 * public E first()                         获取首点
 *
 * public E floor(E e)                      返回小于或等于给定键值的最大键值
 *
 * public SortedSet headSet(E toElement)    返回key<=toElement集合
 *
 * public NavigableSet headSet(E toElement, boolean inclusive)
 *                      返回key<=toElement集合，inclusive=true返回的集合在原set中，会包含自己，否则不会包含
 *
 * public E higher(E e)                     返回严格大于给定键值的最小键值
 *
 * public boolean isEmpty()                 判断集合是否为空
 *
 * public Iterator iterator()               迭代输出
 *
 * public E last()                          获取最后的值
 *
 * public E lower(E e)                      返回严格小于给定键值的最大键值
 *
 * public E pollFirst()                     获取第一个值并移除第一个值
 *
 * public E pollLast()                      获取最后值并移除这个值
 *
 * public boolean remove(Object o)          移除元素
 *
 * public int size()                        当前set容量
 *
 * public Spliterator spliterator()         方法用于拆分set元素，并逐个迭代它们。
 *
 * public NavigableSet subSet(E fromElement, boolean fromInclusive, E toElement,   boolean toInclusive)
 *                                          返回from到to之间的值，fromInclusive和toInclusive代表是否包含当前值
 *
 * public SortedSet subSet(E fromElement, E toElement)
 *                                          返回from到to之间的值，包含from，不包含to，即【左闭右开）
 *
 * public SortedSet tailSet(E fromElement)  返回>=fromElement值的集合元素
 *
 * public NavigableSet tailSet(E fromElement, boolean inclusive)
 *                                  返回>=fromElement值的集合元素，inclusive=true包含自身，=false就不包含
 * */
public class SetDemo {
    public static void main(String[] args) {
        HashSet<Point> hashSet = Get.getPointHashSet(10, 30, 60);
        System.out.println(hashSet);
        Iterator<Point> iterator = hashSet.iterator();
        while (iterator.hasNext())
            System.out.println(iterator.next());
    }
}
